home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Suzy B Software 2
/
Suzy B Software CD-ROM 2 (1994).iso
/
new_file
/
falcon
/
dsppaula
/
dsppaula.lzh
/
dsppauv2.asm
< prev
next >
Wrap
Assembly Source File
|
1993-11-01
|
11KB
|
339 lines
;****************************************************************************
;******************* D S P - P A U L A - SSI-Version *******************
;**************** coded by Chris of AURA of the INEPENDENT ****************
;**************** thanx to Bitmaster and Questor of Inter ****************
;************************ for the great information *************************
;****************************************************************************
;*************** first code : 14.04.93 ***************
;*************** last changes: 12.05.93 ***************
;****************************************************************************
;wichtige Hinweise:
;die DSP-Paula darf nur komplett im Y-Ram betrieben werden.
;Hostcommand $13 wird durch die DSP-Paula belegt-
;es werden insgesamt 2 Stackeinträge benötigt-
dsp_paula_start: equ $4000-7100 ;Startadr. des DSP-Paulacodes
v_hz: equ 50 ;VBL-Frequenz
sam_bufcnt: equ 33300/v_hz ;max. Bytedurchsatzpufferlänge pro VBL
;Erfahrungswert
;*********************************************************************
;r7: Stereopufferadresse
org P:$10 ;SSI-Transmit
movep Y:(r7)+,X:<<$ffef ;1 Monosamplewort rüber
org P:$12 ;SSI-Transmit with Exception
movep Y:(r7)+,X:<<$ffef ;1 Monosamplewort rüber
;*********************************************************************
;Vektor für Hostcommand 1 setzen
org P:$26 ;Hostcommandvektor 1
jsr dsp_paula
;*********************************************************************
org P:dsp_paula_start
install_paula:
clr a
move a1,P:voice1_par ;Stimme 1-Parameter setzen
move a1,P:voice1_par+4 ;Restoffset
move a1,P:voice1_par+5 ;auf 0,0
move a1,P:voice2_par ;Stimme 2-Parameter setzen
move a1,P:voice2_par+4 ;Restoffset
move a1,P:voice2_par+5 ;auf 0,0
move a1,P:voice3_par ;Stimme 3-Parameter setzen
move a1,P:voice3_par+4 ;Restoffset
move a1,P:voice3_par+5 ;auf 0,0
move a1,P:voice4_par ;Stimme 4-Parameter setzen
move a1,P:voice4_par+4 ;Restoffset
move a1,P:voice4_par+5 ;auf 0,0
move #sam_clc,r1
jclr #0,X:<<$ffe9,*
movep X:<<$ffeb,Y:(r1) ;Samplebyteanzahl holen
move #stereo1_trk,r0 ;Stereopuffer
rep #1000*2*2
move a,Y:(r0)+ ;löschen
bset #13,X:<<$ffff
bset #12,X:<<$ffff ;SSI auf Prio 3
movep #$01f8,X:<<$ffe1 ;PCC: alle SSI-Ports auf seriell
movep #$0000,X:<<$ffe3 ;PCDDR setzen: alles 'in'
movep #$4100,X:<<$ffec ;CRA setzen: 16 Bit/ 2 Worte
;pro Frame
movep #$4a00,X:<<$ffed ;CRB setzen: Transmitter-IRQ an
;Network/syncron....
move #$ffff,m7
infinity:
jmp infinity
;*********************************************************************
dsp_paula:
;vorberechnete Stereodaten an den Host
andi #$fc,mr
ori #$2,mr ;auf Prio 2 gehen
bclr #3,X:<<$ffe8 ;HF2 löschen
move r0,P:save_reg
move #save_reg+1,r0
move m0,P:save_reg+23
movec #$ffff,m0
nop
move r1,Y:(r0)+ ;Adressregister
move r2,Y:(r0)+
move r3,Y:(r0)+
move r4,Y:(r0)+
move n0,Y:(r0)+
move n1,Y:(r0)+ ;Offsetregister
move n2,Y:(r0)+
move n4,Y:(r0)+
move m1,Y:(r0)+ ;Modifierreg.
move m2,Y:(r0)+
move m3,Y:(r0)+
move m4,Y:(r0)+
move x0,Y:(r0)+ ;Arithmetikregister
move x1,Y:(r0)+
move y0,Y:(r0)+
move y1,Y:(r0)+
move a2,Y:(r0)+
move a1,Y:(r0)+
move a0,Y:(r0)+
move b2,Y:(r0)+
move b1,Y:(r0)+
move b0,Y:(r0)+
movec m0,m1
movec m0,m2 ;setzen
movec m0,m3
movec m0,m4
bset #12,X:<<$ffed ;SSI-IRQ starten
;auf Frame-Sync warten
jclr #2,X:<<$ffee,* ;auf abst. Flanke warten
jset #2,X:<<$ffee,* ;auf aufst. Flanke warten
nop ;keine Ahnung-NOPs
nop
nop
move P:stereo_puf_adr,r7 ;1. Pufferadr. holen
move P:stereo_puf_adr+1,r4 ;2. Pufferadr. holen
move r7,P:stereo_puf_adr+1 ;vertauschen
move r4,P:stereo_puf_adr ;r7 >> akt. Abspieladresse
bset #3,X:<<$ffe8 ;HF2 setzen >> DSP-Paula am Werk
;Samples der 4 Stimmen holen
move #voice1_par,r0
jsr get_sample_data ;Sampledaten holen
move #voice2_par,r0 ;2. Stimme
jsr get_sample_data ;Sampledaten holen
move #voice3_par,r0 ;3. Stimme
jsr get_sample_data ;Sampledaten holen
move #voice4_par,r0 ;4. Stimme
jsr get_sample_data ;Sampledaten holen
;Stimmen mischen
;r4: akt. Berechnungspufferadr.
move #<$2,n1 ;Monooffset
move #voice1_par,r0 ;Puffer der 1. Stimme
move r4,r1
jsr calc_one_voice ;berechnen
move #voice4_par,r0 ;Puffer der 4. Stimme
move r4,r1
jsr mix_one_voice ;berechnen und dazumischen
move #voice2_par,r0 ;Puffer der 2. Stimme
lua (r4)+,r1
jsr calc_one_voice ;berechnen
move #voice3_par,r0 ;Puffer der 3. Stimme
lua (r4)+,r1
jsr mix_one_voice ;berechnen und dazumischen
move P:sam_clc,x0 ;Sampleanzahl holen
move r4,a
add x0,a
add x0,a
move a,r4 ;r4: Samplepufferende
move #>1,n4
do #8,knacken_kill
move Y:(r4)+,x0 ;8 Worte kopieren
move x0,Y:(r4+n4) ;dadurch Knacken verhindern
knacken_kill:
move #save_reg+1,r0
nop
move Y:(r0)+,r1 ;Adressregister
move Y:(r0)+,r2
move Y:(r0)+,r3
move Y:(r0)+,r4
move Y:(r0)+,n0
move Y:(r0)+,n1 ;Offsetregister
move Y:(r0)+,n2
move Y:(r0)+,n4
move Y:(r0)+,m1 ;Modifierreg.
move Y:(r0)+,m2
move Y:(r0)+,m3
move Y:(r0)+,m4
move Y:(r0)+,x0 ;Arithmetikregister
move Y:(r0)+,x1
move Y:(r0)+,y0
move Y:(r0)+,y1
move Y:(r0)+,a2
move Y:(r0)+,a1
move Y:(r0)+,a0
move Y:(r0)+,b2
move Y:(r0)+,b1
move Y:(r0)+,b0
move Y:(r0)+,m0 ;Modifierreg.
move P:save_reg,r0
bclr #3,X:<<$ffe8 ;HF2 löschen >> DSP nun frei
rti
;***************************************
;Berechnet 1 Spur ohne mischen
;r0: Parameteradr. des Samples
;r1: Stereopufferadr.
calc_one_voice:
lua (r0)+,r2 ;1 Eintrag überspringen
nop ;Pipeline-NOP
move Y:(r2)+,y1 ;Lautstärke holen
move Y:(r2)+,x1 ;Sample-Vorkommaoffset holen
move Y:(r2)+,x0 ;Sample-Nachkommaoffset holen
move r2,r3
move Y:(r2)+,b ;Restvorkomma holen
move Y:(r2)+,b0 ;Restnachkomma holen
move r2,y0 ;Sampleadr.
add y0,b r2,n2 ;+,Sampleadr. retten
move b1,r2 ;Startadr. im Samplepuffer
move P:sam_clc,y0 ;Anzahl holen
do y0,calc_one_voice_do
add x,b Y:(r2),y0 ;Sampleoffset addieren
;Samplebyte holen
mpy y1,y0,a b1,r2 ;*Lautstärke,neue Sampleadr. holen
move a0,Y:(r1)+n1 ;und speichern
calc_one_voice_do:
move n2,x0 ;Samplestart holen
sub x0,b ;- akt. Sampleposition
move b1,x0
bclr #0,x0 ;auf Wort abrunden
move x0,Y:(r0) ;und speichern
sub x0,b ;- >> Restoffset errechnen
move b1,Y:(r3)+ ;und für nächsten VBL speichern
move b0,Y:(r3)
rts
;***************************************
;Berechnet 1 Spur mit mischen
;r0: Pufferadr. des Samples
;r1: Stereopufferadr.
mix_one_voice:
lua (r0)+,r2 ;1 Eintrag überspringen
nop ;Pipeline-NOP
move Y:(r2)+,y1 ;Lautstärke holen
move Y:(r2)+,x1 ;Sample-Vorkommaoffset holen
move Y:(r2)+,x0 ;Sample-Nachkommaoffset holen
move r2,r3
move Y:(r2)+,b ;Restvorkomma holen
move Y:(r2)+,b0 ;Restnachkomma holen
move r2,y0 ;Sampleadr.
add y0,b r2,n2 ;+,Sampleadr. retten
move b1,r2 ;Startadr. im Samplepuffer
move P:sam_clc,y0 ;Anzahl
clr a ;a löschen
do y0,mix_one_voice_do
add x,b Y:(r2),y0 ;Sampleoffset addieren
;Samplebyte holen
move Y:(r1),a0 ;zuvor berechn. Samplewert holen
mac y1,y0,a b1,r2 ;*Lautstärke,neue Sampleadr. holen
clr a a0,Y:(r1)+n1 ;und speichern
mix_one_voice_do:
move n2,x0 ;Samplestart holen
sub x0,b ;- akt. Sampleposition
move b1,x0
bclr #0,x0 ;auf Wort abrunden
move x0,Y:(r0) ;und speichern
sub x0,b ;- >> Restoffset errechnen
move b1,Y:(r3)+ ;und für nächsten VBL speichern
move b0,Y:(r3)
rts
;***************************************
;Läd Lautstärke und Sample in den Y-Speicher
;Sampledaten von 0 bis 255
;r0: Parameteradr. des Sampels
get_sample_data:
jclr #1,X:<<$ffe9,*
movep Y:(r0)+,X:<<$ffeb ;Tatsächlich bearb. Bytes senden
jclr #0,X:<<$ffe9,*
movep X:<<$ffeb,Y:(r0)+ ;Lautstärke holen
jclr #0,X:<<$ffe9,*
movep X:<<$ffeb,Y:(r0)+ ;Schrittweite Vorkomma holen
jclr #0,X:<<$ffe9,*
movep X:<<$ffeb,Y:(r0)+ ;Schrittweite Nachkomma holen
move #<2,n0
nop ;Pipeline-NOP
lua (r0)+n0,r0 ;Restwert überspringen
jclr #0,X:<<$ffe9,*
movep X:<<$ffeb,y0 ;Anzahl der zu übertr. Worte holen
move #>$10000/2,x0 ;Verschiebungswert durch mpy
move #>128,x1 ;Subr.Wert
move #>$0000FF,y1 ;Ausmaskierungswert
do y0,load_sample
jclr #0,X:<<$ffe9,*
movep X:<<$ffeb,y0 ;2 8-bit-Samplewerte holen
;wichtig: oberstes Byte mu₧ null sein
mpy x0,y0,a ;oberes Byte nach a1 schieben
sub x1,a ;-128
move y0,a a,Y:(r0)+ ;und speichern
and y1,a ;unteres Byte holen
sub x1,a ;-128
move a,Y:(r0)+ ;unteres Byte speichern
load_sample:
rts
;***************************************
save_reg: ds 25 ;Platz für die Register
sam_clc: ds 1 ;Anzahl der Samplebytes
stereo_puf_adr:
dc stereo1_trk,stereo2_trk
;Parameter und Puffer für die Samples
voice1_par: ds 1 ;tatsächlich abgearb. Bytes
;auf Wortgrenze abgerundet
;mu₧ dem Host vor neuer Sampleübergabe
;übermittelt werden
;Lautstärke als Fraktionalwert (zw. 0 und 1)
ds 1 ;Lautstärke als Kommawert
;vom Host pro VBL übermittelt
;Schrittweite innerhalb des Samples
ds 2 ;Sampleoffset (48 Bit)
;Da der Samplepuffer nie vollständig abgearbeitet wird, bleibt ein Rest
;übrig der das nächste Mal zur voice_buf-Adr. dazuaddiert werden mu₧.
ds 2 ;Restoffset von der letzten Berechnung
voice1_buf: ds sam_bufcnt ;Puffer der Sampledaten
voice2_par: ds 6
voice2_buf: ds sam_bufcnt ;Puffer der Sampledaten
voice3_par: ds 6
voice3_buf: ds sam_bufcnt ;Puffer der Sampledaten
voice4_par: ds 6
voice4_buf: ds sam_bufcnt ;Puffer der Sampledaten
;****************************************
;Stereopuffer, 2 Spuren gemischt
stereo1_trk: ds 1000*2 ;Stereopuffer 1
stereo2_trk: ds 1000*2 ;Stereopuffer 2
;****************************************
end:
end dsp_paula_start ;Installierung starten